package com.nit.lab.service.basic.impl;

import com.nit.lab.dto.basic.DeptDTO;
import com.nit.lab.dto.system.TreeDTO;
import com.nit.lab.dto.utils.PagingDTO;
import com.nit.lab.dto.utils.TableReqDTO;
import com.nit.lab.dto.utils.TableRspDTO;
import com.nit.lab.entity.basic.DeptEntity;
import com.nit.lab.mapper.basic.DeptMapper;
import com.nit.lab.service.basic.DeptService;
import ma.glasnost.orika.MapperFactory;
import ma.glasnost.orika.impl.DefaultMapperFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

@Service
public class DeptServiceImpl implements DeptService {
    private final DeptMapper deptMapper;

    @Autowired(required = false)
    public DeptServiceImpl(DeptMapper deptMapper) {
        this.deptMapper = deptMapper;
    }

    @Override
    public TableRspDTO list4Table(TableReqDTO tableReqDTO) throws Exception {
        Long count = deptMapper.count4Table(
                tableReqDTO.parseQueryParam("deptName"));
        PagingDTO pagingDTO = new PagingDTO(
                tableReqDTO.getPageNo(),
                tableReqDTO.getPageSize(),
                count,
                deptMapper.list4Table(
                        tableReqDTO.getStart(),
                        tableReqDTO.getPageSize(),
                        tableReqDTO.parseQueryParam("deptName")));
        TableRspDTO tableRspDTO = new TableRspDTO(pagingDTO);
        return tableRspDTO;
    }

    @Override
    @Transactional(rollbackFor = Exception.class)
    public Integer add(DeptDTO deptDTO) throws Exception {
        MapperFactory mapperFactory = new DefaultMapperFactory.Builder().build();
        DeptEntity deptEntity = mapperFactory.getMapperFacade().map(deptDTO, DeptEntity.class);
        deptEntity.setGmtCreate(new Date());
        return deptMapper.add(deptEntity);
    }

    @Override
    @Transactional(rollbackFor = Exception.class)
    public Integer update(DeptDTO deptDTO) throws Exception {
        MapperFactory mapperFactory = new DefaultMapperFactory.Builder().build();
        DeptEntity deptEntity = mapperFactory.getMapperFacade().map(deptDTO, DeptEntity.class);
        return deptMapper.update(deptEntity);
    }

    @Override
    @Transactional(rollbackFor = Exception.class)
    public Integer remove(String deptIds) throws Exception {
        String[] arrayDeptId = deptIds.split(",");
        for (int i = 0; i < arrayDeptId.length; i++) {
            deptMapper.remove(Long.parseLong(arrayDeptId[i]));
        }
        return arrayDeptId.length;
    }

    @Override
    public List<DeptDTO> listDept() throws Exception {
        return deptMapper.listDept();
    }

    @Override
    public List<TreeDTO> listDeptTree(Long deptId, Long deptType) throws Exception {
        TreeDTO treeDto;
        List<TreeDTO> listTreeTwo;
        List<TreeDTO> listTreeThree;
        List<TreeDTO> listTreeOne = new ArrayList<TreeDTO>();
        List<DeptDTO> listDeptDto = deptMapper.listDeptTree();
        listTreeTwo = new ArrayList<TreeDTO>();
        //通过单位fatherId判断,生成单位树型结构
        for (int i = 1; i < listDeptDto.size(); i++) {
            if (listDeptDto.get(i).getDeptFathers().equals(String.valueOf(deptId))) {
                listTreeThree = new ArrayList<TreeDTO>();
                if (deptType == 1) { //一级单位生成三级树
                    for (int j = 1; j < listDeptDto.size(); j++) {
                        if (listDeptDto.get(j).getDeptFathers().equals(String.valueOf(listDeptDto.get(i).getDeptId()))) {
                            treeDto = new TreeDTO();
                            treeDto.setTitle(listDeptDto.get(j).getDeptName());
                            treeDto.setKey(Integer.parseInt(String.valueOf(listDeptDto.get(j).getDeptId())));
                            treeDto.setValue(Integer.parseInt(String.valueOf(listDeptDto.get(j).getDeptId())));
                            listTreeThree.add(treeDto);
                        }
                    }
                }
                treeDto = new TreeDTO();
                treeDto.setTitle(listDeptDto.get(i).getDeptName());
                treeDto.setKey(Integer.parseInt(String.valueOf(listDeptDto.get(i).getDeptId())));
                treeDto.setValue(Integer.parseInt(String.valueOf(listDeptDto.get(i).getDeptId())));
                treeDto.setChildren(listTreeThree);
                listTreeTwo.add(treeDto);
            }
        }
        for (DeptDTO deptDTO : listDeptDto) {
            if (deptDTO.getDeptId().equals(deptId)) {
                treeDto = new TreeDTO();
                treeDto.setTitle(deptDTO.getDeptName());
                treeDto.setKey(Integer.parseInt(String.valueOf(deptDTO.getDeptId())));
                treeDto.setValue(Integer.parseInt(String.valueOf(deptDTO.getDeptId())));
                treeDto.setChildren(listTreeTwo);
                listTreeOne.add(treeDto);
                break;
            }
        }
        return listTreeOne;
    }
}
